package br.com.rookgraph.heuristica;

import br.com.rookgraph.Edge;

public class NotEstanqueBack implements Heuristica { 

	@Override
	public Edge selectForCut(Edge candidate, Edge edgeCut) {

		Edge edgeSelect = edgeCut;

		if (edgeSelect == null || candidate.alfa > edgeSelect.alfa) {
			edgeSelect = candidate;

		} else if (candidate.alfa == edgeSelect.alfa) {

			if (candidate.gama < edgeSelect.gama) {
				edgeSelect = candidate;

			}else if( candidate.gama == edgeSelect.gama){

				if( candidate.sigma < edgeSelect.sigma){
					edgeSelect = candidate;
				}		
			}
		}					
		return edgeSelect;
	}

	@Override
	public Edge selectForRep(Edge candidate, Edge edgeRep) {

		// Escolhe a aresta onde a troca for a Melhor, ou seja onde haverá a MAIOR perda de branches (o mais negativo)					
		if (edgeRep == null || candidate.alfa < edgeRep.alfa) {
			edgeRep = candidate;

		} else if (candidate.alfa == edgeRep.alfa) {
			
			// adicionada em 03/11
			//edgeRep = candidate;
			
			if (candidate.gama < edgeRep.gama) {
				edgeRep = candidate;

				}else if( candidate.gama == edgeRep.gama){

					if( candidate.sigma > edgeRep.sigma){
						edgeRep = candidate;
					}		
				}
			}
			
		return edgeRep;
	}

	/* (non-Javadoc)
	 * @see br.com.rookgraph.heuristica.Heuristica#isVantajoso(br.com.rookgraph.Edge, br.com.rookgraph.Edge)
	 *
	 * Esse metodo pode ser melhorado chamando um dos acima
	 * -TODO verifica isso
	 *
	 */
	@Override
	public boolean isVantajoso(Edge edgeRep, Edge edgeCut) {

		Edge vantajosa = selectForRep(edgeRep, edgeCut);

		return vantajosa == edgeRep;	}


	
	public boolean ganhoTroca1 (Edge edgeRep, Edge edgeCut, Edge edgeEntrada, Edge edgeSaida) {

	int diffAlfaCandidata, diffAlfaEntrada, diffGamaCandidata, diffGamaEntrada,diffSigmaCandidata,diffSigmaEntrada;
	
	// falta pegar a ordem correta da matriz - quantidade de vertices	
	if (edgeRep.gama == 2) { 
		edgeRep.gama = 100;
	}else if ( edgeRep.gama == 1) { 
		edgeRep.gama = 101;
	
	}
		
	diffAlfaCandidata = edgeRep.alfa-edgeCut.alfa;
	diffGamaCandidata =  edgeRep.gama-edgeCut.gama;
	diffSigmaCandidata = edgeCut.sigma-edgeRep.sigma;
	
	diffAlfaEntrada = edgeEntrada.alfa-edgeSaida.alfa;
	diffGamaEntrada =  edgeEntrada.gama-edgeSaida.gama;
	diffSigmaEntrada = edgeSaida.sigma-edgeEntrada.sigma;

	if (diffAlfaCandidata < diffAlfaEntrada){	
		return true;

	}else if (diffAlfaCandidata == diffAlfaEntrada) { 

		if (diffGamaCandidata < diffGamaEntrada) {
			return  true;

		}else if (diffGamaCandidata == diffGamaEntrada) {

			if (diffSigmaCandidata > diffSigmaEntrada) {
				return  true;
			}
		}
	}
	return false;
}

	@Override
	public boolean ganhoTroca(Edge edgeEntrada, Edge edgeSaida) {
		// TODO Auto-generated method stub
		return false;
	}
}
	


